home *** CD-ROM | disk | FTP | other *** search
-
- #include <string.h>
- #include "proto.h"
-
- #ifndef SMALL_EGEM
- void ob_clear_edit(reg OBJECT *obj)
- {
- reg int flags;
-
- for (;;)
- {
- flags = obj->ob_flags;
- if (flags & EDITABLE)
- ob_get_text(obj,0,TRUE);
- if (flags & LASTOB)
- break;
- else
- obj++;
- }
- }
- #endif
-
- static int ob_state(DIAINFO *info,OBJECT *tree,int obj,int masc,int set,int draw)
- {
- reg OBJECT *ob_ptr;
- reg int state,old_state;
-
- ob_ptr = &tree[obj];
- old_state = state = ob_ptr->ob_state;
-
- switch (set)
- {
- case SET_STATE:
- state |= masc;
- break;
- case CLEAR_STATE:
- state &= ~masc;
- break;
- default:
- state ^= masc;
- }
-
- if (state!=old_state)
- {
- if (info)
- {
- if (draw)
- ob_draw_chg(info,obj,NULL,state,FALSE);
- }
- else if (draw)
- {
- wind_update(BEG_UPDATE);
- objc_change(tree,obj,0,desk.g_x,desk.g_y,desk.g_w,desk.g_h,state,1);
- wind_update(END_UPDATE);
- }
- ob_ptr->ob_state = state;
- return (TRUE);
- }
- else
- return (FALSE);
- }
-
- int ob_select(DIAINFO *info,OBJECT *tree,int obj,int select,int draw)
- {
- return(ob_state(info,tree,obj,SELECTED,select,draw));
- }
-
- int ob_disable(DIAINFO *info,OBJECT *tree,int obj,int disable,int draw)
- {
- reg int changed;
-
- if (draw && info)
- {
- if ((changed=ob_state(NULL,tree,obj,DISABLED,disable,FALSE))!=0)
- ob_draw(info,obj);
- }
- else
- changed = ob_state(info,tree,obj,DISABLED,disable,draw);
- return (changed);
- }
-
- int ob_draw(DIAINFO *info,int obj)
- {
- return(ob_draw_chg(info,obj,NULL,FAIL,FALSE));
- }
-
- int ob_draw_list(reg DIAINFO *info,reg int *ob_lst,reg GRECT *area)
- {
- if (info->di_flag>CLOSED && !info->di_win->iconified && _popup==0 && (_dia_len==0 || info==_dia_list[_dia_len-1]))
- {
- reg OBJECT *tree = info->di_tree;
- GRECT win,work;
-
- if (area)
- win = *area;
- else
- win = *(GRECT *) &tree->ob_x;
-
- if (rc_intersect(&desk,&win))
- {
- reg int *objs,ob;
-
- #ifndef SMALL_EGEM
- if (info->di_cursor)
- {
- objs = ob_lst;
- ob = info->di_ed_obj;
- while (*objs)
- if (*objs++==ob)
- {
- _cursor_off(info);
- break;
- }
- }
- #endif
-
- if (info->di_flag<WINDOW)
- {
- _clip_rect(&win);
- while ((ob=*ob_lst++)>0)
- objc_draw(tree,ob,MAX_DEPTH,win.g_x,win.g_y,win.g_w,win.g_h);
- _clip_rect(&desk);
- }
- else
- {
- wind_update(BEG_UPDATE);
- window_first(info->di_win,&work);
- while (work.g_w>0 && work.g_h>0)
- {
- if (rc_intersect(&win,&work))
- {
- _clip_rect(&work);
-
- objs = ob_lst;
- while ((ob=*objs++)>0)
- objc_draw(tree,ob,MAX_DEPTH,work.g_x,work.g_y,work.g_w,work.g_h);
- }
- window_next(info->di_win,&work);
- }
- _clip_rect(&desk);
- wind_update(END_UPDATE);
- }
-
- return (TRUE);
- }
- }
-
- return (FALSE);
- }
-
- int ob_draw_chg(DIAINFO *info,int obj,GRECT *area,int new_state,boolean top)
- {
- reg OBJECT *tree = info->di_tree;
- int exit = FALSE;
-
- if (info->di_flag==CLOSED || info->di_win->iconified || _popup || (_dia_len>0 && info!=_dia_list[_dia_len-1]))
- {
- if (new_state>=0)
- {
- if (tree!=NULL)
- tree[obj].ob_state = new_state;
- else
- exit = FAIL;
- }
- }
- else
- {
- reg OBJECT *ob = tree + obj;
- GRECT win,work;
-
- if (area)
- win = *area;
- else
- win = *(GRECT *) &tree->ob_x;
-
- if (rc_intersect(&desk,&win))
- {
- #ifndef SMALL_EGEM
- if (info->di_cursor && (obj==info->di_ed_obj || obj==0))
- _cursor_off(info);
- #endif
-
- if (top || info->di_flag<WINDOW)
- {
- _clip_rect(&win);
- if (new_state>=0)
- objc_change(tree,obj,0,win.g_x,win.g_y,win.g_w,win.g_h,new_state,1);
- else
- objc_draw(tree,obj,MAX_DEPTH,win.g_x,win.g_y,win.g_w,win.g_h);
- _clip_rect(&desk);
- }
- else
- {
- int old_state = ob->ob_state;
-
- wind_update(BEG_UPDATE);
- window_first(info->di_win,&work);
- while (work.g_w>0 && work.g_h>0)
- {
- if (rc_intersect(&win,&work))
- {
- _clip_rect(&work);
- if (new_state>=0)
- {
- objc_change(tree,obj,0,work.g_x,work.g_y,work.g_w,work.g_h,new_state,1);
- ob->ob_state = old_state;
- }
- else
- objc_draw(tree,obj,MAX_DEPTH,work.g_x,work.g_y,work.g_w,work.g_h);
- }
- window_next(info->di_win,&work);
- }
- _clip_rect(&desk);
- wind_update(END_UPDATE);
- }
- exit = TRUE;
- }
-
- if (new_state>=0)
- ob->ob_state = new_state;
- }
-
- return (exit);
- }
-
- int ob_radio(OBJECT *tree,int parent,int object)
- {
- reg int i,radio = 0,first = tree[parent].ob_head,last = tree[parent].ob_tail;
- reg OBJECT *obj;
-
- i = first;
- while (i>=first && i<=last)
- {
- obj = tree + i;
- if (obj->ob_flags & RBUTTON)
- {
- if (!(obj->ob_state & DISABLED))
- {
- if (radio==object)
- obj->ob_state |= SELECTED;
- else if (obj->ob_state & SELECTED)
- {
- if (object>=0)
- obj->ob_state &= ~SELECTED;
- else
- object = radio;
- }
- }
- radio++;
- }
- i = obj->ob_next;
- }
- return (object);
- }
-
- int ob_get_parent(OBJECT *tree,int obj)
- {
- reg int index = 0,parent = 0;
-
- do
- {
- if (tree->ob_head<=obj && tree->ob_tail>=obj)
- parent = index;
- tree++;index++;
- }
- while (!(tree->ob_flags & LASTOB));
-
- return(parent);
- }
-
- int _get_hotkey(OBJECT *tree,int button)
- {
- reg OBJECT *obj = &tree[button];
- reg int i,last,type;
-
- type = obj->ob_type & G_TYPE;
- if ((unsigned char) type!=G_USERDEF)
- type = (unsigned char) type;
-
- switch (type)
- {
- case G_IND:
- case G_HOTKEY:
- return (button);
- case G_CHK:
- case G_RB:
- if ((button = obj->ob_next)<0)
- return (FAIL);
- obj = &tree[button];
- case G_TEXT:
- case G_FTEXT:
- case G_BOXTEXT:
- case G_FBOXTEXT:
- case G_STRING:
- case G_BUTTON:
- case G_BOXCHAR:
- if ((i=obj->ob_head)>0)
- for (last=obj->ob_tail,obj=&tree[i];i<=last;i++,obj++)
- {
- switch (obj->ob_type & G_TYPE)
- {
- case G_IND:
- case G_HOTKEY:
- return (i);
- }
- }
- }
-
- return (FALSE);
- }
-
- char ob_get_hotkey(OBJECT *tree,int button)
- {
- reg int obj = _get_hotkey(tree,button);
-
- if (obj>0)
- return(tree[obj].ob_state>>8);
- else
- return(0);
- }
-
- int ob_set_hotkey(OBJECT *tree,int button,char hot)
- {
- reg int obj = _get_hotkey(tree,button);
-
- if (obj>0)
- {
- reg int width,parent = ob_get_parent(tree,obj);
- reg OBJECT *ob_ptr = &tree[obj],*par_ptr = &tree[parent];
- reg char *text = ob_get_text(tree,parent,FALSE),*pos;
-
- if (text && ((pos = strchr(text,UpperChar(hot)))!=NULL || (pos = strchr(text,LowerChar(hot)))!=NULL))
- {
- width = (int) strlen(text);
-
- switch((unsigned char) par_ptr->ob_type)
- {
- case G_TEXT:
- case G_FTEXT:
- case G_BOXTEXT:
- case G_FBOXTEXT:
- if (par_ptr->ob_spec.tedinfo->te_font==SMALL)
- width *= gr_sw;
- else
- width *= gr_cw;
-
- switch (par_ptr->ob_spec.tedinfo->te_just)
- {
- case TE_LEFT:
- ob_ptr->ob_x = 0;
- break;
- case TE_RIGHT:
- ob_ptr->ob_x = par_ptr->ob_width - width;
- break;
- case TE_CNTR:
- ob_ptr->ob_x = (par_ptr->ob_width - width)>>1;
- }
-
- if (par_ptr->ob_spec.tedinfo->te_font==SMALL)
- ob_ptr->ob_x += (int) ((long) (pos - text) * gr_sw);
- else
- ob_ptr->ob_x += (int) ((long) (pos - text) * gr_cw);
- break;
- case G_BUTTON:
- width *= gr_cw;
- ob_ptr->ob_x = (par_ptr->ob_width - width)>>1;
- ob_ptr->ob_x += (int) ((long) (pos - text) * gr_cw);
- break;
- case G_STRING:
- ob_ptr->ob_x = (int) ((long) (pos - text) * gr_cw);
- break;
- default:
- return(FALSE);
- }
- }
- else if ((unsigned char) par_ptr->ob_type==G_BOXCHAR)
- {
- if (par_ptr->ob_spec.obspec.character==hot)
- ob_ptr->ob_x = (par_ptr->ob_width - gr_cw)>>1;
- else
- return(FALSE);
- }
- else if (hot)
- return(FALSE);
-
- if (hot=='\0')
- ob_ptr->ob_flags |= HIDETREE;
- else
- ob_ptr->ob_flags &= ~HIDETREE;
-
- ob_ptr->ob_state &= 0x00ff;
- ob_ptr->ob_state |= UpperChar(hot)<<8;
-
- return (TRUE);
- }
-
- return(FALSE);
- }
-